package org.example.auth.config.oauth;

import org.apache.dubbo.config.annotation.DubboReference;
import org.example.api.system.RemoteOauthClientService;
import org.example.auth.config.oauth.jdbc.CustomJdbcClientDetailsService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.provider.ClientDetailsService;


/**
 * 客戶端配置
 */
@Configuration
public class ClientDetailsConfiguration {

    @DubboReference
    private  RemoteOauthClientService remoteOauthClientService;
    /**
     *    * 几个重要参数说一下，如下：
     *      *
     *      * .withClient("myjszl")：指定客户端唯一ID为myjszl
     *      * .secret()：指定秘钥，使用加密算法加密了，秘钥为123
     *      * .resourceIds("res1")：给客户端分配的资源权限，对应的是资源服务，比如订单这个微服务就可以看成一个资源，作为客户端肯定不是所有资源都能访问。
     *      * authorizedGrantTypes()：定义认证中心支持的授权类型，总共支持五种
     *      * 授权码模式：authorization_code
     *      * 密码模式：password
     *      * 客户端模式：client_credentials
     *      * 简化模式：implicit
     *      * 令牌刷新：refresh_token，这并不是OAuth2的模式，定义这个表示认证中心支持令牌刷新
     *      * scopes()：定义客户端的权限，这里只是一个标识，资源服务可以根据这个权限进行鉴权。
     *      * autoApprove：是否需要授权，设置为true则不需要用户点击确认授权直接返回授权码
     *      * redirectUris：跳转的uri
     * @return
     * @throws Exception
     */
    @Bean(name = "clientDetailsService")
    public ClientDetailsService clientDetailsService() {

        return new CustomJdbcClientDetailsService(remoteOauthClientService);
    }


}
